// Loesung_von_Aufgabe_4.7_3_Fadenstrahlrohr

PVector B = new PVector(0, 0, -12); // magnetische Flussdichte
PVector r = new PVector(0, 0, 0); // Ortsvektor
float vy = -100; // Betrag der Geschwindigkeit in y-Richtung
PVector v = new PVector(0, vy, 0); // Geschwindigkeitsvektor
float t = 0.001; // Sehr kleiner Zeitschritt um die Rundungsfehler klein zu halten
float m = 10; // Masse
float Q = -1; // Ladung

void setup()
{
  size(400, 400);
  background(255);
  frameRate(1000); /* Hohe Bildwiederholungsrate, damit trotz der kleinen Zeitschritte
   die Simulation in einer angemessenen Zeit abläuft */

  // Fadenstrahlrohr (noch ohne Elektronenkanone)
  noStroke();
  fill(100);
  triangle(50, 380, 190, 200, 340, 380);
  stroke(#07EFF5);
  strokeWeight(3);
  fill(#CFFBFC);
  ellipse(190, 200, 250, 250);
  stroke(#A56805);
  strokeWeight(20);
  noFill();
  ellipse(190, 200, 300, 300);
}

void draw()
{
  translate(100, 200); // Verschiebung des Koordinatenursprungs

  // vektorielle Berechnung der Elektronenbahn
  PVector FL = PVector.mult((B.cross(v)), Q);
  PVector a = PVector.div(FL, m);
  v.add(PVector.mult(a, t));
  r.add(PVector.mult(v, t));

  // Elektron
  noStroke();
  fill(0, 0, 255);
  ellipse(r.x, r.y, 2, 2);

  // zurücksetzen auf die Startwerte
  if (r.x <= 0)
  {
    r = new PVector(0, 0, 0);
    v = new PVector(0, vy, 0);
  } 

  // Zeichen für das B-Feld
  noFill();
  stroke(#56EA39);
  strokeWeight(3);
  ellipse(-70, -170, 30, 30);
  line(-80, -180, -60, -160);
  line(-60, -180, -80, -160);
  fill(#56EA39);
  textSize(32);
  text("B", -40, -160);

  // Elektronenkanone
  noStroke();
  fill(#FA7F38);
  triangle(-12, 10, 0, -10, 12, 10);
}